package NowCoder.JavaSE.String;
import java.util.*;

/**
 * HJ88 扑克牌大小
 * 较难  通过率：29.27%  时间限制：1秒  空间限制：32M
 * 知识点 字符串 链表 队列 栈
 * warning 校招时部分企业笔试将禁止编程题跳出页面，为提前适应，练习时请使用在线自测，而非本地IDE。
 * 描述
 * 扑克牌游戏大家应该都比较熟悉了，一副牌由54张组成，含3~A、2各4张，小王1张，大王1张。
 * 牌面从小到大用如下字符和字符串表示（其中，小写joker表示小王，大写JOKER表示大王）：
 * 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
 * 输入两手牌，两手牌之间用"-"连接，每手牌的每张牌以空格分隔，"-"两边没有空格，如：4 4 4 4-joker JOKER。
 * 请比较两手牌大小，输出较大的牌，如果不存在比较关系则输出ERROR。
 * 基本规则：
 * （1）输入每手牌可能是个子、对子、顺子（连续5张）、三个、炸弹（四个）和对王中的一种，不存在其他情况，由输入保证两手牌都是合法的，顺子已经从小到大排列；
 * （2）除了炸弹和对王可以和所有牌比较之外，其他类型的牌只能跟相同类型的存在比较关系（如，对子跟对子比较，三个跟三个比较），不考虑拆牌情况（如：将对子拆分成个子）；
 * （3）大小规则跟大家平时了解的常见规则相同，个子、对子、三个比较牌面大小；顺子比较最小牌大小；炸弹大于前面所有的牌，炸弹之间比较牌面大小；对王是最大的牌；
 * （4）输入的两手牌不会出现相等的情况。
 *
 * 数据范围：字符串长度： 3≤s≤10
 *
 * 输入描述：
 * 输入两手牌，两手牌之间用"-"连接，每手牌的每张牌以空格分隔，"-"两边没有空格，如 4 4 4 4-joker JOKER。
 *
 * 输出描述：
 * 输出两手牌中较大的那手，不含连接符，扑克牌顺序不变，仍以空格隔开；如果不存在比较关系则输出ERROR。
 *
 * 示例1
 * 输入：
 * 4 4 4 4-joker JOKER
 * 输出：
 * joker JOKER
 * https://www.nowcoder.com/practice/d290db02bacc4c40965ac31d16b1c3eb?tpId=37&tqId=21311&ru=/exam/oj
 */
public class 扑克牌大小_HJ88 {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);

        while(scanner.hasNext()){
            String str = scanner.nextLine();
            String[] arr = str.split("-");
            //因为str代表两副手牌，两副手牌之间用"-"连接，也就是代表该字符串中有且只有一个"-"
            //即第一副手牌为0号下标的字符串，第二幅手牌为1号下标的字符串
            String str1 = arr[0];
            String str2 = arr[1];

            //此时获得了两份受骗，下面则需要对其进行比较，在比较之前，首先先需要对其进行拆分
            String[] arr1 = str1.split(" ");
            String[] arr2 = str2.split(" ");
            pokerRule(arr1,arr2);
        }
    }

    //下面来写比教规则
    public static void pokerRule(String[] str1,String[] str2){
        editAndTranslate(str1);
        editAndTranslate(str2);
        //首先，因为输入每手牌可能是个子，对子，顺子（连续五张），三个，炸弹（四个），和对王中的一种
        //所以首先先要对其进行手牌进行判断
        int num1 = handJudgement(str1);
        int num2 = handJudgement(str2);
        //此时获得了手牌是什么类型的,所以此时需要对是否能比较进行判断
        //他的规则是，除了炸弹和对王可以和所有牌比较以外，其他的类型的牌只能和相同类型的进行比较
        //所以，当其中一个为对王的时候，则无需比较
        //当其中一个为炸弹的时候，只有对方是炸弹，才进行下一步比较，除此，同样也无需比较\
        int[] arr1 = intArrays(str1);
        int[] arr2 = intArrays(str2);
        Arrays.sort(arr1);
        Arrays.sort(arr2);

        if(num1 == 6){
            printString(str1);
            return;
        }
        if(num2 == 6){
            printString(str2);
            return;
        }
        //此时代表手牌中不存在对王了
        if(num1 == 5){
            if(num2 != 5){
                printString(str1);
                return;
            }else{//此时代表两个都为炸弹，所以进行比较
                compare(arr1[0],arr2[0],str1,str2);
                return;
            }
        }
        if(num2 == 5){
            printString(str2);
            return;
        }

        //走到这代表此时手牌中不存在对王和炸弹了，下面只有当手牌一致的时候才能比较
        if(num1 == 1 && num2 == 1){
            compare(arr1[0],arr2[0],str1,str2);
            return;
        }
        if(num1 == 2 && num2 == 2){
            compare(arr1[0],arr2[0],str1,str2);
            return;
        }
        if(num1 == 3 && num2 == 3){
            compare(arr1[0],arr2[0],str1,str2);
            return;
        }
        if(num1 == 4 && num2 == 4){
            compare(arr1[0],arr2[0],str1,str2);
            return;
        }

        //走到这一步，代表手牌仍然没法比较
        System.out.println("ERROR");
    }

    //比较
    private static void compare(int a,int b,String[] str1,String[] str2){
        if(a > b){
            printString(str1);
            return;
        }else if(a < b){
            printString(str2);
            return;
        }else{
            System.out.println("ERROR");
        }
    }

    //写一个打印方法
    private static void printString(String[] str){
        decompile(str);
        for(String i : str){
            System.out.print(i + " ");
        }
    }

    //写一个方法对手牌，进行判断
    //根据返回值来确定
    //1是个子
    //2是对子
    //3是顺子
    //4是三个
    //5是炸弹
    //6是对王
    public static int handJudgement(String[] str){
        //因为手牌为一个的情况下，只可能是个子
        if(str.length == 1){
            return 1;//1代表是个子
        }
        if(str.length == 2){
            //当手牌为两个的时候，可能是对子，也可能是对王
            if(!str[0].equals(str[1])){//因为大王和小王，编译以后的数字是不一样的
                //又因为对子必须两张数字均是一样的，所以只可能是对王
                return 6;//6代表对王
            }
            return 2;//2代表对子
        }
        if(str.length == 5){
            return 3;//3代表顺子
        }
        if(str.length == 3){
            return 4;//4代表三个
        }
        if(str.length == 4){
            return 5;//5代表炸弹
        }
        //走到这一步代表手上的牌不符合规定
        return -1;
    }

    //为了方便比较，此时先对扑克牌进行重新编译
    private static void editAndTranslate(String[] str){
        for(int i = 0;i < str.length;i++){
            switch(str[i]){
                case "J" : str[i] = "11";continue;
                case "Q" : str[i] = "12";continue;
                case "K" : str[i] = "13";continue;
                case "A" : str[i] = "14";continue;
                case "2" : str[i] = "15";continue;
                case "joker" :str[i] = "16";continue;
                case "JOKER" :str[i] = "17";continue;
            }
        }
    }
    //为了方便字符串之间的比较，需要将字符串数组转换为int类型的数组
    private static int[] intArrays(String[] str){
        int size = str.length;
        int[] arr = new int[size];
        for(int i = 0;i < size;i++){
            switch(str[i]){
                case "3" : arr[i] = 3;continue;
                case "4" : arr[i] = 4;continue;
                case "5" : arr[i] = 5;continue;
                case "6" : arr[i] = 6;continue;
                case "7" : arr[i] = 7;continue;
                case "8" : arr[i] = 8;continue;
                case "9" : arr[i] = 9;continue;
                case "10" : arr[i] = 10;continue;
                case "11" : arr[i] = 11;continue;
                case "12" : arr[i] = 12;continue;
                case "13" : arr[i] = 13;continue;
                case "14" : arr[i] = 14;continue;
                case "15" : arr[i] = 15;continue;
                case "16" : arr[i] = 16;continue;
                case "17" : arr[i] = 17;continue;
            }
        }
        return arr;
    }

    //由于最后需要将手牌打印，所以需要在打印前进行反编译
    private static void decompile(String[] str){
        for(int i = 0;i < str.length;i++){
            switch(str[i]){
                case "11" : str[i] = "J";continue;
                case "12" : str[i] = "Q";continue;
                case "13" : str[i] = "K" ;continue;
                case "14" : str[i] = "A";continue;
                case "15" : str[i] = "2";continue;
                case "16" :str[i] = "joker";continue;
                case "17" :str[i] = "JOKER";continue;
            }
        }
    }
}
